package com.itheima.d14_extends_constructor;

/**
 * 子类构造器的特点：
 *  子类的全部构造器，都会先调用父类的构造器，再执行自己。
 *
 *  子类构造器是如何实现调用父类构造器的：
 * 默认情况下，子类全部构造器的第一行代码都是 super() （写不写都有） ，它会调用父类的无参数构造器。
 * 如果父类没有无参数构造器，则我们必须在子类构造器的第一行手写super(….)，指定去调用父类的有参数构造器。
 */
public class Test2 {
    public static void main(String[] args) {
        // 目标：搞清楚子类构造器为什么要调用父类构造器，有啥应用场景。
        Teacher t = new Teacher("李四", 36, "Java");
        System.out.println(t.getName());
        System.out.println(t.getAge());
        System.out.println(t.getSkill());
        System.out.println(t.toString());



        System.out.println("=======================");
        //试验一下字符串的subtring方法，忘记了
        String s1 = new String();
        String s2 = s1;
        System.out.println("new的s1是: "+s1);
        System.out.println(s1==s2);  //true 这说明此时s1和s2都指向 堆内存的new的s1空白字符串对象
        s1 = "new完之后再重新赋值看看";
        Boolean bol = (s1==s2);
        System.out.println("s1==s2 "+bol);  //false 这说明给s1用“”之后的字符串对象是放在字符串常量池当中。而s2还是指向堆内存的地址
        System.out.println("s2= "+s2);
        System.out.println("new的s1是: "+s1);
        System.out.println(s1.substring(0, 2));  //substring是截取


    }
}

class Teacher extends People{
    private String skill;

    public Teacher(String name, int age, String skill){
        //在子类中调用父类的有参构造器可以方便的为name和age赋值
        super(name , age);

       /*如果变量很多，那就很麻烦
        setName(name);
        setAge(age);*/

        //这样写会报错,因为继承的原因，name和age都是在父类中的，是不能在子类中用对象.去直接去访问当前这个对象的name和age变量
        /*this.name = name;
        this.age = age;*/

        this.skill = skill;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }
}

class People{
    private String name;
    private int age;

    public People() {
    }

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}